package com.lg.algorithm.collections.queue.block;

import lombok.SneakyThrows;

import java.util.concurrent.*;

/**
 * 开始多大
 * 可以指定初始大小，指定大小后不能扩容；不指定大小，默认为integer.max。链表初始都指向一个内容为空的node
 *
 * 是否可以扩容
 * 指定大小不会扩容
 *
 * 增加的时候会被阻塞
 * 会
 *
 * 往外拿的时候也会被阻塞
 * 会
 *
 * 他们的原理是怎样的
 * 增加满的时候 notFull.awaitNanos(nanos)  等待被唤醒，增加完了之后notEmpty.signal()
 * 拉取的时候，如果元素为空notEmpty.await()，拿完元素notFull.signal()
 *
 * 阻塞线程会被挂起么
 * 会 LockSupport.park(this)
 *
 * 阻塞会释放锁资源么
 * 会 LockSupport.park(this)
 *
 */

public class LinkedBlockingQueueTest {
    @SneakyThrows
    public static void main(String[] args) {

        LinkedBlockingQueue<Integer> integers1 = new LinkedBlockingQueue<>(1);
        LinkedBlockingQueue<Integer> integers = new LinkedBlockingQueue<>();
        /**
         * 失败抛出异常
         *      add  remove element
         *          element 看一看但不拿出来
         */
        System.out.println("======抛出异常======");
        boolean add1 = integers1.add(1);
         integers1.put(1);
        integers1.put(1);
//        boolean add11 = integers1.add(1);
        System.out.println(integers1.element());
        System.out.println(integers1.size());
        integers1.remove(1);
        System.out.println(integers1.size());

        /**
         *  特殊返回
         *      offer   poll    peek
         */
        System.out.println("======特殊返回======");
        integers1.offer(1);
        integers1.peek();
        integers1.poll();

        System.out.println("======超时返回======");
        integers1.offer(1, 1, TimeUnit.SECONDS);
        integers1.poll(1, TimeUnit.SECONDS);

        System.out.println("======阻塞======");
        integers1.put(1);
        integers1.take();
    }
}
